home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / HD / SmartFileSystem / V1.58 / Sources / SFScheck / asmsupport.s < prev    next >
Encoding:
Text File  |  1999-01-21  |  5.3 KB  |  372 lines

  1.     Opt    l+,case
  2.  
  3.     XDef    _RANDOM
  4.     XDef    _CALCCHECKSUM
  5.     XDef    _MULU64
  6.     XDef    _COMPRESSFROMZERO
  7.     XDef    _COMPRESS
  8.     XDef    _STACKSWAP
  9.  
  10.     Incdir    "INCLUDE:"
  11.  
  12.     Include    "exec/types.i"
  13.     Include    "exec/nodes.i"
  14.     Include    "exec/tasks.i"
  15.  
  16. Start
  17.  
  18. MuluLWQ    MACRO    ;DataReg1,DataReg2
  19.     ;Reg1.L x Reg2.W = Reg1.L:Reg2.L
  20.     Move.l    a0,-(sp)
  21.     Move.l    \1,a0
  22.     Mulu.w    \2,\1
  23.     Exg    \1,a0
  24.     Swap    \1
  25.     Mulu.w    \1,\2
  26.     Swap    \2
  27.     Moveq    #0,\1
  28.     Move.w    \2,\1
  29.     Clr.w    \2
  30.     Add.l    a0,\2
  31.     Bcc.s    .ExitRoutine\@
  32.     Addq.l    #1,\1
  33. .ExitRoutine\@    Move.l    (sp)+,a0
  34.     ENDM
  35.  
  36. MuluLLQ    MACRO    ;DataReg1,DataReg2
  37.     ;Reg1.L x Reg2.L = Reg1.L:Reg2.L
  38.     Movem.l    a0-a1,-(sp)
  39.     Movem.l    \1/\2,-(sp)
  40.     MuluLWQ    \1,\2
  41.     Move.l    \1,a0
  42.     Move.l    \2,a1
  43.     Movem.l    (sp)+,\1/\2
  44.     Swap    \2
  45.     MuluLWQ    \1,\2
  46.     Swap    \1
  47.     Swap    \2
  48.     Move.w    \2,\1
  49.     Clr.w    \2
  50.     Add.l    a1,\2
  51.     Bcc.s    .NoOverFlow\@
  52.     Addq.l    #1,\1
  53. .NoOverFlow\@    Add.l    a0,\1
  54.     Movem.l    (sp)+,a0-a1
  55.     ENDM
  56.  
  57.  
  58.     CNOP    0,4
  59. _MULU64    ; IN: d0.l = 32-bit number
  60.     ; IN: d1.l = 32-bit number
  61.     ; IN: a0.l = Ptr to 4 bytes for low 32 bits
  62.     ;OUT: d0.l = High 32 bits
  63.  
  64. ;    Mulu.l    d0,d0:d1    68020+ instruction (not allowed on 060!)
  65.  
  66.     MuluLLQ    d0,d1
  67.     Move.l    d1,(a0)
  68.     Rts
  69.  
  70.  
  71.  
  72.     CNOP    0,4
  73. _STACKSWAP    Move.l    (a7),d7
  74.  
  75.     Move.l    4.w,a6
  76.     Suba.l    a1,a1
  77.     Jsr    -294(a6)    Exec - FindTask
  78.     Move.l    d0,a0
  79.  
  80.     Move.l    TC_SPUPPER(a0),d0
  81.     Sub.l    TC_SPLOWER(a0),d0
  82.     Cmp.l    #4000,d0
  83.     Bge.s    .KeepStack
  84.  
  85.     Move.l    #StackSwapStruct_SIZEOF+4096,d0
  86.     Moveq    #0,d1
  87.     Jsr    -198(a6)    Exec - AllocMem
  88.     Tst.l    d0
  89.     Beq.s    .Exit
  90.     Move.l    d0,a0
  91.  
  92.     Lea    StackSwapStruct_SIZEOF(a0),a1
  93.     Move.l    a1,stk_Lower(a0)
  94.     Add.w    #4080,a1
  95.     Move.l    a1,stk_Pointer(a0)
  96.     Addq.l    #8,a1
  97.     Move.l    a1,stk_Upper(a0)
  98.     Jsr    -732(a6)    Exec - StackSwap
  99.     Move.l    d7,(a7)
  100.  
  101. .KeepStack    Moveq    #-1,d0
  102.     Rts
  103. .Exit    Moveq    #0,d0
  104.     Rts
  105.  
  106.  
  107.  
  108.     CNOP    0,4
  109. _RANDOM    ; IN: d0.l = Seed
  110.     ;OUT: d0.l = New seed
  111.     Movem.l    d1-d2,-(sp)
  112.  
  113.     Moveq    #0,d1
  114.     Move.w    d0,d1
  115.     Clr.w    d0
  116.     Swap    d0
  117.  
  118.     Move.l    d0,d2
  119.     Lsl.l    #8,d0
  120.     Add.l    d2,d0
  121.  
  122.     Move.l    d1,d2
  123.     Lsl.l    #8,d1
  124.     Add.l    d2,d1
  125.  
  126.     Move.l    d0,d2
  127.     Swap    d2
  128.     And.l    #$7fff0000,d2
  129.     Add.l    d2,d1
  130.     Bvc.s    .Skip
  131.     Addq.l    #1,d1
  132.  
  133. .Skip    Moveq    #15,d2
  134.     Lsr.l    d2,d0
  135.     Add.l    d1,d0
  136.     Bclr    #31,d0
  137.  
  138.     Movem.l    (sp)+,d1-d2
  139.     Rts
  140.  
  141.  
  142.     CNOP    0,4
  143. _CALCCHECKSUM    ; IN: d0.l = Blocksize in bytes (must be a multiple of 16!)
  144.     ; IN: a0.l = ULONG *
  145.     ;OUT: d0.l = Checksum
  146.  
  147.     Move.l    d0,d1
  148.     Lsr.l    #4,d1
  149.     Subq.l    #1,d1
  150.     Moveq    #1,d0
  151.  
  152. .Loop    Add.l    (a0)+,d0
  153.     Add.l    (a0)+,d0
  154.     Add.l    (a0)+,d0
  155.     Add.l    (a0)+,d0
  156.     Dbra    d1,.Loop
  157.  
  158.     Rts
  159.  
  160.  
  161.  
  162.     CNOP    0,4
  163. _COMPRESSFROMZERO    ; IN: a0.l UWORD *new
  164.     ; IN: a1.l UBYTE *dest
  165.     ; IN: d0.w bytes_block
  166.     ;OUT: d0.l Compressed length
  167.  
  168.     Movem.l    d2-d3/a2-a4,-(sp)
  169.  
  170.     Move.l    a1,a4
  171.     Lea    (a0,d0.w),a2
  172.     Moveq    #-1,d2
  173.  
  174. .Loop    Move.l    a2,d1
  175.     Sub.l    a0,d1    d1 = 2
  176.     Lsr.l    #1,d1    d1 = 1
  177.     Subq.l    #1,d1    d1 = 0
  178.  
  179.     Cmp.w    #64-1,d1
  180.     Ble.s    .Continue
  181.     Moveq    #64-1,d1
  182.  
  183. .Continue    Move.w    d1,d3
  184.     Subq.w    #1,d3
  185.     Move.w    (a0),d0
  186.     Bne.s    .NotClear
  187.  
  188. .LoopClr    Tst.w    (a0)+
  189.     Dbne    d1,.LoopClr
  190.  
  191.     ; Above loop will be left when (a3) wasn't zero or when d1 reaches -1.  If the
  192.     ; loop is left because (a3) wasn't zero then d1 won't be decreased by one.
  193.  
  194.     ; d1 = 62 -> 1 zero word found.
  195.     ; d1 = 0  -> 63 zero words found.
  196.     ; d1 = -1 -> 64 zero words found.
  197.  
  198.     Tst.b    d1
  199.     Blt.s    .Skip
  200.     Subq.l    #2,a0
  201.  
  202. .Skip    Sub.b    d1,d3
  203.     Move.b    d3,(a1)+
  204.     Bra.s    .DoLoop
  205.  
  206. .NotClear    Cmp.w    d2,d0
  207.     Bne.s    .NotSet
  208.  
  209. .LoopSet    Cmp.w    (a0)+,d2
  210.     Dbne    d1,.LoopSet
  211.  
  212.     Tst.b    d1
  213.     Blt.s    .Skip2
  214.     Subq.l    #2,a0
  215.  
  216. .Skip2    Sub.b    d1,d3
  217.     Or.b    #$80,d3
  218.     Move.b    d3,(a1)+
  219.     Bra.s    .DoLoop
  220.  
  221. .NotSet    Move.l    a1,a3
  222.     Addq.l    #1,a1
  223. ;    Move.w    d0,(a1)+
  224.  
  225. .LoopAny    Move.w    (a0)+,d0
  226.     Beq.s    .Stop
  227.     Cmp.w    d2,d0
  228.     Beq.s    .Stop
  229.     Move.w    d0,(a1)+
  230.     Dbra    d1,.LoopAny
  231.  
  232.     Bra.s    .Skip3
  233.  
  234. .Stop    Subq.l    #2,a0
  235. .Skip3    Sub.b    d1,d3
  236.     Or.b    #$C0,d3
  237.     Move.b    d3,(a3)
  238.  
  239. .DoLoop    Cmp.l    a2,a0
  240.     Blt.s    .Loop
  241.  
  242.     Move.l    a1,d0
  243.     Sub.l    a4,d0
  244.  
  245.     Movem.l    (sp)+,d2-d3/a2-a4
  246.     Rts
  247.  
  248.  
  249.  
  250.  
  251.     CNOP    0,4
  252. _COMPRESS    ; IN: a0.l UWORD *new
  253.     ; IN: a1.l UWORD *old
  254.     ; IN: a6.l UBYTE *dest
  255.     ; IN: d0.w bytes_block
  256.     ;OUT: d0.l Compressed length
  257.  
  258.     Movem.l    d2-d4/a2-a4/a6,-(sp)
  259.  
  260.     Lea    (a0,d0.w),a2
  261.     Moveq    #-1,d2
  262.  
  263. .Loop    Move.l    a2,d1
  264.     Sub.l    a0,d1    d1 = 2
  265.     Lsr.l    #1,d1    d1 = 1
  266.     Subq.l    #1,d1    d1 = 0
  267.  
  268.     Cmp.w    #64-1,d1
  269.     Ble.s    .Continue
  270.     Moveq    #64-1,d1
  271.  
  272. .Continue    Move.w    d1,d3
  273.     Subq.b    #1,d3
  274.     Move.w    d1,d4
  275.     Move.l    a0,a3
  276.     Move.l    a1,a4
  277.  
  278. .LoopUnchanged    Cmpm.w    (a3)+,(a4)+
  279.     Dbne    d4,.LoopUnchanged
  280.  
  281.     Move.w    (a0),d0
  282.     Bne.s    .NotClear
  283.  
  284. .LoopClr    Tst.w    (a0)+
  285.     Dbne    d1,.LoopClr
  286.  
  287.     ; Above loop will be left when (a3) wasn't zero or when d1 reaches -1.  If the
  288.     ; loop is left because (a3) wasn't zero then d1 won't be decreased by one.
  289.  
  290.     ; d1 = 62 -> 1 zero word found.
  291.     ; d1 = 0  -> 63 zero words found.
  292.     ; d1 = -1 -> 64 zero words found.
  293.  
  294.     Cmp.w    d1,d4    0,3 -> 3-0 = 3
  295.     Blt.s    .Unchanged
  296.  
  297.     Tst.b    d1
  298.     Blt.s    .Skip
  299.     Subq.l    #2,a0
  300.  
  301. .Skip    Sub.b    d1,d3
  302.     Lea    2(a1,d3.w*2),a1
  303.     Move.b    d3,(a6)+
  304.     Bra.s    .DoLoop
  305.  
  306.  
  307. .NotClear    Cmp.w    d2,d0
  308.     Bne.s    .NotSet
  309.  
  310. .LoopSet    Cmp.w    (a0)+,d2
  311.     Dbne    d1,.LoopSet
  312.  
  313.     Cmp.w    d1,d4
  314.     Blt.s    .Unchanged
  315.  
  316.     Tst.b    d1
  317.     Blt.s    .Skip2
  318.     Subq.l    #2,a0
  319.  
  320. .Skip2    Sub.b    d1,d3
  321.     Lea    2(a1,d3.w*2),a1
  322.     Or.b    #$80,d3
  323.     Move.b    d3,(a6)+
  324.     Bra.s    .DoLoop
  325.  
  326.  
  327. .Unchanged    Tst.b    d4
  328.     Blt.s    .Skip4
  329.     Subq.l    #2,a3
  330.     Subq.l    #2,a4
  331.  
  332. .Skip4    Sub.b    d4,d3
  333.     Or.b    #$40,d3
  334.     Move.b    d3,(a6)+
  335.     Move.l    a3,a0
  336.     Move.l    a4,a1
  337.     Bra.s    .DoLoop
  338.  
  339.  
  340. .NotSet    Cmp.b    d4,d3
  341.     Bge.s    .Unchanged
  342.  
  343.     Move.l    a6,a3
  344.     Addq.l    #1,a6
  345.  
  346. .LoopAny    Move.w    (a0)+,d0
  347.     Beq.s    .Stop
  348.     Cmp.w    d2,d0
  349.     Beq.s    .Stop
  350.     Cmp.w    (a1)+,d0
  351.     Beq.s    .Stop2
  352.     Move.w    d0,(a6)+
  353.     Dbra    d1,.LoopAny
  354.  
  355.     Bra.s    .Skip3
  356.  
  357. .Stop2    Subq.l    #2,a1
  358. .Stop    Subq.l    #2,a0
  359. .Skip3    Sub.b    d1,d3
  360.     ;Lea    2(a1,d3.w*2),a1
  361.     Or.b    #$C0,d3
  362.     Move.b    d3,(a3)
  363.  
  364. .DoLoop    Cmp.l    a2,a0
  365.     Blt    .Loop
  366.  
  367.     Move.l    a6,d0
  368.  
  369.     Movem.l    (sp)+,d2-d4/a2-a4/a6
  370.     Sub.l    a6,d0
  371.     Rts
  372.